/**
 * 这个节点无法出外部导入json
 * 另外一个 TreeExt 支持 从外部导入
 */
let  Node = {

    //类变量和方法
    createNew: function (id, 属性) {
        let self = { id: id, vals: 属性, up: null, children: {} }
        return self;
    },
    add子节点: function (节点, 子节点) {
        if (节点.hasOwnProperty("children")) {
            节点.children[子节点.id] = 子节点
            子节点["up"] = 节点
        }
    },
    del子节点: function (节点, 子节点) {
        if (节点.hasOwnProperty("children")) {
            if (节点.children.hasOwnProperty(子节点.id)) {
                delete 节点["children"][子节点.id]
                子节点 = null
            }
        }
    },
    search: function (节点, 节点id) {
        return this.down直到(节点, function (nd) {
            if (nd.id == 节点id)
                return nd;
            else
                return null;
        })
    },
    downall: function (节点, call) {
        if (节点 == null || call == null) return;
        call(节点);
        for (var key in 节点.children) {
            let 子节点 = 节点.children[key];
            console.log("子节点", key, 子节点)
            this.downall(子节点, call);
        }
    },
    down直到: function (节点, call) {
        if (节点 == null || call == null) return null;
        let flag = call(节点);
        if (flag != null) {          //如果为true 停止遍历
            return 节点;
        }//如果为false 继续遍历
        for (var key in 节点.children) {
            let 子节点 = 节点.children[key];
            let obj = this.down直到(子节点, call);
            if (obj != null) return obj;
        }
        return null;
    },
    upall: function (节点, call) {
        if (节点 == null || call == null) return;
        call(节点)
        this.upall(节点.up, call)
    },
    up直到: function (节点, call) {
        if (节点 == null || call == null) return null;
        // console.log(节点)
        let obj = call(节点)
        if (obj != null)
            return obj;
        return this.up直到(节点.up, call);
    }

}
export default Node;

// let nd = Node.createNew('1', { 姓名: 1 });
// let nd1 = Node.createNew('2', { 姓名: 2 });
// let nd2 = Node.createNew('3', { 姓名: 3 });
// let nd21 = Node.createNew('4', { 姓名: 4 });
// let nd3 = Node.createNew('5', { 姓名: 5 });
// let nd31 = Node.createNew('6', { 姓名: 6 });
// let nd32 = Node.createNew('7', { 姓名: 7 });
// let nd311 = Node.createNew('8', { 姓名: 8 });
// let nd3111 = Node.createNew('9', { 姓名: 9 });

// Node.add子节点(nd, nd1)
// Node.add子节点(nd, nd2)
// Node.add子节点(nd2, nd21)
// Node.add子节点(nd, nd3)
// Node.add子节点(nd3, nd31)
// Node.add子节点(nd3, nd32)
// Node.add子节点(nd31, nd311)
// Node.add子节点(nd311, nd3111)
// Node.downall(nd, function (ndd) {
//     console.log(ndd)
// })
// let ndd = Node.search(nd, '8');
// console.log(ndd)

// let ndd = Node.up直到(nd311, function (nddd) {
//     if (nddd.id == '5') {
//         console.log(nddd)
//         return nddd
//     }    else
//         return null;
// })


// Node.upall(nd3111, function (nddd) {
//     console.log(nddd.id)
// })